﻿// Version posterior mejorada/simplificada a arKristal_v1.02

package motor.colision {
	
	import flash.display.*;
	
	public class Arista {
		public var punto0x,punto0y,punto1x,punto1y:Number;
				
		public var cuerpoC:Cuerpo;
		
		
		public function Arista (p0x:Number,p0y:Number,p1x:Number,p1y:Number,esteCuerpo:Cuerpo)
		{
			cuerpoC=esteCuerpo;
			punto0x=p0x-cuerpoC.xReal;
			punto0y=p0y-cuerpoC.yReal;
			punto1x=p1x-cuerpoC.xReal;
			punto1y=p1y-cuerpoC.yReal;			
		}
		
		public function tipo ():String
		{
			if (punto0x==punto1x) return "V";
			if (punto0y==punto1y) return "H"
			return "Cualquiera!!!";
		}
		
		public function get pun0x ():Number
		{
			return punto0x+cuerpoC.xReal;
		}
		public function get pun1x ():Number
		{
			return punto1x+cuerpoC.xReal;
		}
		public function get pun0y ():Number
		{
			return punto0y+cuerpoC.yReal;
		}
		public function get pun1y ():Number
		{
			return punto1y+cuerpoC.yReal;
		}
		
		public function get velx ():Number		
		{
			return this.cuerpoC.getVX();
		}
		
		public function get vely ():Number		
		{
			return this.cuerpoC.getVY();
		}
		
		//Esta funcion se invoca con un punto por parametro y otraArista; Solo devolvera 1 colision
		private function puntualTotal (px:Number, py:Number, vx:Number, vy:Number, //Punto
									   q0x:Number, q0y:Number, q1x:Number, q1y:Number, bx:Number, by:Number, //Arista
									   cuerpo1:Cuerpo, cuerpo2:Cuerpo,
									   arista1:Arista, arista2:Arista
									   ):Colision 
		//Cuerpos el cuerpo1 es el dueño del punto ; cuerpo2 es el dueño de la arista
		//El mismo principio anterior se aplica a las aristas.
																				
		{
			var numerador:Number   = (vx-bx)*(q0y-py)-(vy-by)*(q0x-px);
			var denominador:Number = (vy-by)*(q1x-q0x)-(vx-bx)*(q1y-q0y);
			
			
			//trace ("Arista: Numerador="+numerador + " ; Denomina="+denominador);
			
			
			if (denominador==0) return null;
			
			var proporcion:Number = numerador / denominador;
			
			if ( (proporcion>=0)&&(proporcion<=1) )
			{
				//Interseccion valida.
				
				/*trace (px,",",py," ; ",q0x,",",q0y," -> ",q1x," , ",q1y);*/
				
				var tiempo:Number = q0x+proporcion*(q1x-q0x)-px;
				var t2:Number = vx-bx; // si esto == 0 entonces las velocidades son iguales, lo q hace imposible una colision X.
				if (t2==0)
				{
					tiempo = q0y+proporcion*(q1y-q0y)-py;
					t2 = vy-by;
					//trace ("proporcionY: ",proporcion," Tiempo: ",1000*tiempo/t2," ms");
				} else
				{
					//trace ("proporcionX: ",proporcion," Tiempo: ",1000*tiempo/t2," ms");
				}
				/*----*/
				if (t2 == 0)
				{
					return null;
				} else
				{					
					tiempo=tiempo/t2;
					if (tiempo>=0)
					{						
						var colision:Colision = new Colision(cuerpo1,cuerpo2,tiempo*1000,arista1,arista2);
						/*trace ("Devuelvo una colision Correcta! Ocurrira en ",tiempo*1000," tipoArista:",arista1.tipo());*/
						return colision;
					} else return null;
				}
			} else
			{
				// La interseccion esta fuera de la arista, o sea en la recta pero mas alla de donde nos interesa.
				return null;
			}
			trace ("Arista: puntualTotal: ERROR!!!");
			return null;
		}
		
		public function seColisionan (otraArista:Arista, otroCuerpo:Cuerpo):Colision
		{								
	
			/*----*/
			var c1:Colision=puntualTotal /*el punto 0 de esta arista*/
					(this.pun0x,this.pun0y,this.velx,this.vely,
					otraArista.pun0x,otraArista.pun0y,otraArista.pun1x,otraArista.pun1y,otraArista.velx,otraArista.vely,
					cuerpoC,otroCuerpo,this,otraArista);/*Hay q respetar la relacion cuerpo-arista*/
			/*----*/
			var c2:Colision=puntualTotal /*el punto 1 de esta arista*/
					(this.pun1x,this.pun1y,this.velx,this.vely,
					otraArista.pun0x,otraArista.pun0y,otraArista.pun1x,otraArista.pun1y,otraArista.velx,otraArista.vely,
					cuerpoC,otroCuerpo,this,otraArista);
			/*--LA OTRA ARISTA--*/
			var c3:Colision=puntualTotal /*el punto 0 de la otra arista*/
					(otraArista.pun0x,otraArista.pun0y,otraArista.velx,otraArista.vely,
					this.pun0x,this.pun0y,this.pun1x,this.pun1y,this.velx,this.vely,
					otroCuerpo,cuerpoC,otraArista,this);
			/*----*/
			var c4:Colision=puntualTotal /*el punto 1 de la otra arista*/
					(otraArista.pun1x,otraArista.pun1y,otraArista.velx,otraArista.vely,
					this.pun0x,this.pun0y,this.pun1x,this.pun1y,this.velx,this.vely,
					otroCuerpo,cuerpoC,otraArista,this);
			/*-----*/
			
			var colisionMenor:Colision=null;
			if (c1!=null) colisionMenor=c1;
			if (c2!=null)
			{
				if (colisionMenor==null)
				{
					colisionMenor=c2;
				} else
				{
					if (colisionMenor.tiempoColision>c2.tiempoColision) colisionMenor=c2;
				}
			}
			if (c3!=null)
			{
				if (colisionMenor==null)
				{
					colisionMenor=c3;
				} else
				{
					if (colisionMenor.tiempoColision>c3.tiempoColision) colisionMenor=c3;
				}
			}
			if (c4!=null)
			{
				if (colisionMenor==null)
				{
						colisionMenor=c4;
				} else
				{
					if (colisionMenor.tiempoColision>c4.tiempoColision) colisionMenor=c4;
				}
			}			

			return colisionMenor;
		}		
		
	}	
}